/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.uca.sisbec.helpers.manto;

import com.uca.sisbec.beans.CodeAndName;
import com.uca.sisbec.beans.ModuloBean;
import com.uca.sisbec.commons.Utils;
import com.uca.sisbec.forms.manto.PantallaForm;
import com.uca.sisbec.mapping.Modulo;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Juank
 */
public class PantallaHelper {
    private Session session;
    
    public PantallaHelper(Session session){
        this.session = session;
    }

    public int insertarPantalla(PantallaForm pf) {
        int pos = 0;
        Modulo modulo = new Modulo();
        modulo.setAccion(pf.getAccion());
        modulo.setDescripcion(pf.getDescripcion());
        modulo.setEstado(pf.isEstado() ? "A" : "I");
        modulo.setModulo(pf.getNombre());
        if (pf.isHijo() && !Utils.isNullOrEmpty(pf.getOpcionPrincipal())){
            modulo.setOpcPrincipal(pf.getOpcionPrincipal());
            pos = getDefaultPosition(Integer.parseInt(pf.getOpcionPrincipal()));
        } else {
            pos = getDefaultPositionParent();
        }
        modulo.setOrdenMenu(pos);
        session.save(modulo);
        return modulo.getIdModulo();
    }

    private int getDefaultPosition(int codigo) {
        Query query = session.createQuery("select str(max(ordenMenu)) from Modulo where opcPrincipal = :principal");
        query.setString("principal", Integer.toString(codigo));
        String pos = (String) query.uniqueResult();
        return !Utils.isNullOrEmpty(pos) ? Integer.parseInt(pos) + 1 : 1;
    }

    private int getDefaultPositionParent() {
        Query query = session.createQuery("select max(ordenMenu) from Modulo where opcPrincipal is null");
        int pos = (Integer) query.uniqueResult();
        return (pos != 0) ? pos + 1 : 1;
    }

    public List<CodeAndName> getMenuPrincipalList() {
        String hql = "select new com.uca.sisbec.beans.CodeAndName(idModulo, modulo) ";
        hql += "from Modulo where opcPrincipal is null";
        Query query = session.createQuery(hql);
        return new ArrayList<CodeAndName>(query.list());
    }

    public void modificarPantalla(PantallaForm pf) {
        Modulo modulo = getPantalla(pf.getCodigo());
        int pos = 0;
        modulo.setAccion(pf.getAccion());
        modulo.setDescripcion(pf.getDescripcion());
        modulo.setEstado(pf.isEstado() ? "A" : "I");
        modulo.setModulo(pf.getNombre());
        if (Utils.isNullOrEmpty(modulo.getOpcPrincipal()) || !pf.getOpcionPrincipal().equals(modulo.getOpcPrincipal())){
            if (pf.isHijo() && !Utils.isNullOrEmpty(pf.getOpcionPrincipal())){
                modulo.setOpcPrincipal(pf.getOpcionPrincipal());
                pos = getDefaultPosition(Integer.parseInt(pf.getOpcionPrincipal()));
            } else {
                modulo.setOpcPrincipal(null);
                pos = getDefaultPositionParent();
            }
            modulo.setOrdenMenu(pos);
        }
        session.update(modulo);
    }
    
    private Modulo getPantalla(int codigo){
        return (Modulo) session.get(Modulo.class, codigo);
    }
    
    public void getPantallaForm(PantallaForm pf){
        Modulo modulo = getPantalla(pf.getCodigo());
        pf.setAccion(modulo.getAccion());
        pf.setDescripcion(modulo.getDescripcion());
        pf.setEstado(modulo.getEstado().equals("A"));
        pf.setNombre(modulo.getModulo());
        pf.setOpcionPrincipal(Utils.isNullOrEmpty(modulo.getOpcPrincipal()) ? "" : modulo.getOpcPrincipal());
        pf.setHijo(!Utils.isNullOrEmpty(modulo.getOpcPrincipal()));
    }
    
    public List<ModuloBean> getPantallasList(PantallaForm pf){
        String hql = "";
        Query query;
        List<ModuloBean> moduloList = new ArrayList<ModuloBean>();
        /**
         * P = Padres, T = Todos, H = Hijos
         */
        if (pf.getFlgFilter().equals("P") || pf.getFlgFilter().equals("T")){
            hql = "select new com.uca.sisbec.beans.ModuloBean("
                    + "idModulo, modulo, 'Padre', '') "
                    + "from Modulo "
                    + "where modulo like '%' || :v_modulo || '%' "
                    + "and opcPrincipal is null";
            query = session.createQuery(hql);
            query.setString("v_modulo", pf.getNombre());
            moduloList = new ArrayList<ModuloBean>(query.list());
        }
        
        if (pf.getFlgFilter().equals("H") || pf.getFlgFilter().equals("T")){
            hql = "select new com.uca.sisbec.beans.ModuloBean("
                    + "m1.idModulo, m1.modulo, 'Hijo', m2.modulo) "
                    + "from Modulo m1, Modulo m2 "
                    + "where m1.modulo like '%' || :v_modulo || '%' "
                    + "and m1.opcPrincipal = m2.idModulo";
            query = session.createQuery(hql);
            query.setString("v_modulo", pf.getNombre());
            moduloList.addAll(new ArrayList<ModuloBean>(query.list()));
        }
        return moduloList;
    }

    public List<CodeAndName> getParentList() {
        String hql = "select new com.uca.sisbec.beans.CodeAndName("
                + "idModulo, modulo) "
                + "from Modulo "
                + "where opcPrincipal is null and estado = 'A' "
                + "order by ordenMenu";
        Query query = session.createQuery(hql);
        List<CodeAndName> moduloList = new ArrayList<CodeAndName>(query.list());
        return moduloList;
    }

    public void guardarOrdenMenus(String[] menus) {
        Modulo modulo = null;
        for (int i = 0; i < menus.length; i++){
            modulo = (Modulo) session.get(Modulo.class, Integer.parseInt(menus[i]));
            modulo.setOrdenMenu(i + 1);
            session.update(modulo);
        }
    }

    public List<CodeAndName> showOptionsMenu(int menu) {
        String hql = "select new com.uca.sisbec.beans.CodeAndName("
                + "idModulo, modulo) "
                + "from Modulo "
                + "where opcPrincipal = :menu and estado = 'A' "
                + "order by ordenMenu";
        Query query = session.createQuery(hql);
        query.setInteger("menu", menu);
        List<CodeAndName> moduloList = new ArrayList<CodeAndName>(query.list());
        return moduloList;
    }

    public void guardarOrdenOpciones(String[] opciones) {
        Modulo modulo = null;
        for (int i = 0; i < opciones.length; i++){
            modulo = (Modulo) session.get(Modulo.class, Integer.parseInt(opciones[i]));
            modulo.setOrdenMenu(i + 1);
            session.update(modulo);
        }
    }
}